#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>
#define UART_DEVICE "/dev/ttyS9"

int set_opt(int, int, int, char, int);

int main(int argc, char *argv[])
{
    int fd, read_static;
    char buffer[128];

    printf("uart is %s\n", UART_DEVICE);

    printf("\r\nhanweiai200 %s write read test start\r\n", UART_DEVICE);

    if ((fd = open(UART_DEVICE, O_RDWR | O_NOCTTY | O_NDELAY)) < 1)
    {
        printf("open %s is failed", UART_DEVICE);
    }
    else
    {
        printf("open %s is success\n", UART_DEVICE);
        set_opt(fd, 115200, 8, 'N', 1);

        while (1)
        {
            read_static = read(fd, buffer, sizeof(buffer) - 1);
            buffer[read_static] = 0;
            if (read_static < 0)
            {
                printf("\r\nhanweiAI200 start receive \r\n");
                printf("read failed\n");
            }
            else if (read_static > 0)
            {
                printf("read test start!!!\n");
                printf("Received message: %s\n", buffer);
                
                // 回复相同的消息
                write(fd, buffer, strlen(buffer));
                printf("232 测试成功\n");
                system("echo \"$(date)：232 测试成功\" >> /userfs/all.txt");
            }
        }
    }
    close(fd);
}

// set option for serial
int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio, oldtio;
    if (tcgetattr(fd, &oldtio) != 0)
    {
        perror("Setup Serial 1");
        return -1;
    }
    bzero(&newtio, sizeof(newtio));
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_cflag &= ~CSIZE;

    switch (nBits)
    {
    case 7:
        newtio.c_cflag |= CS7;
        break;
    case 8:
        newtio.c_cflag |= CS8;
        break;
    }

    switch (nEvent)
    {
    case 'O':
        newtio.c_cflag |= PARENB;
        newtio.c_cflag |= PARODD;
        newtio.c_iflag |= (INPCK | ISTRIP);
        break;
    case 'E':
        newtio.c_iflag |= (INPCK | ISTRIP);
        newtio.c_cflag |= PARENB;
        newtio.c_cflag &= ~PARODD;
        break;
    case 'N':
        newtio.c_cflag &= ~PARENB;
        break;
    }

    switch (nSpeed)
    {
    case 2400:
        cfsetispeed(&newtio, B2400);
        cfsetospeed(&newtio, B2400);
        break;
    case 4800:
        cfsetispeed(&newtio, B4800);
        cfsetospeed(&newtio, B4800);
        break;
    case 9600:
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        break;
    case 115200:
        cfsetispeed(&newtio, B115200);
        cfsetospeed(&newtio, B115200);
        break;
    case 460800:
        cfsetispeed(&newtio, B460800);
        cfsetospeed(&newtio, B460800);
        break;
    default:
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        break;
    }
    if (nStop == 1)
        newtio.c_cflag &= ~CSTOPB;
    else if (nStop == 2)
        tcflush(fd, TCIFLUSH);
    if ((tcsetattr(fd, TCSANOW, &newtio)) != 0)
    {
        perror("com set error");
        return -1;
    }
    return 0;
}


// #include <stdio.h>
// #include <string.h>
// #include <unistd.h>
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>
// #include <termios.h>
// #include <errno.h>

// #define UART_DEVICE "/dev/ttyS9"

// int set_opt(int, int, int, char, int);
// void write_to_rx(int, const char *);

// int main(int argc, char *argv[])
// {
//     int fd, read_static;
//     char buffer[128];
//     int send_count = 0; // 用于计数发送次数

//     printf("uart is %s\n", UART_DEVICE);
//     printf("\r\nhanweiai200 %s write read test start\r\n", UART_DEVICE);

//     if ((fd = open(UART_DEVICE, O_RDWR | O_NOCTTY | O_NDELAY)) < 1)
//     {
//         printf("open %s is failed\n", UART_DEVICE);
//         return -1; // 打开失败，返回错误
//     }
//     else
//     {
//         printf("open %s is success\n", UART_DEVICE);
//         set_opt(fd, 115200, 8, 'N', 1);

//         while (send_count < 3) // 发送次数达到3次后退出循环
//         {
//             read_static = read(fd, buffer, sizeof(buffer) - 1);
//             if (read_static < 0)
//             {
//                 printf("\r\nhanweiAI200 start receive \r\n");
//                 printf("read failed\n");
//             }
//             else if (read_static > 0)
//             {
//                 buffer[read_static] = 0; // 确保以 null 结尾
//                 printf("read test start!!!\n");
//                 printf("Received message: %s\n", buffer);

//                 // 回复相同的消息
//                 write(fd, buffer, strlen(buffer));
//                 printf("Sent message: %s\n", buffer);

//                 // 检查发送的消息和接收的消息是否相同
//                 if (strcmp(buffer, buffer) == 0) // 此处我们要保存发送的内容以便比较
//                 {
//                     printf("232 测试成功\n");
//                     system("echo \"$(date) 232 测试成功\" >> /userfs/all.txt");
//                 }
//             }

//             // 模拟向232的RX写入数据
//             write_to_rx(fd, "Test message to RX");
//             send_count++; // 增加计数
//             printf("Sent message count: %d\n", send_count);

//             sleep(1); // 防止过于频繁的循环
//         }

//         printf("Sent 3 messages, exiting...\n");
//     }

//     close(fd);
//     return 0; // 正常退出程序
// }

// // set option for serial
// int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
// {
//     struct termios newtio, oldtio;
//     if (tcgetattr(fd, &oldtio) != 0)
//     {
//         perror("Setup Serial 1");
//         return -1;
//     }
//     bzero(&newtio, sizeof(newtio));
//     newtio.c_cflag |= CLOCAL | CREAD;
//     newtio.c_cflag &= ~CSIZE;

//     switch (nBits)
//     {
//     case 7:
//         newtio.c_cflag |= CS7;
//         break;
//     case 8:
//         newtio.c_cflag |= CS8;
//         break;
//     }

//     switch (nEvent)
//     {
//     case 'O':
//         newtio.c_cflag |= PARENB;
//         newtio.c_cflag |= PARODD;
//         newtio.c_iflag |= (INPCK | ISTRIP);
//         break;
//     case 'E':
//         newtio.c_iflag |= (INPCK | ISTRIP);
//         newtio.c_cflag |= PARENB;
//         newtio.c_cflag &= ~PARODD;
//         break;
//     case 'N':
//         newtio.c_cflag &= ~PARENB;
//         break;
//     }

//     switch (nSpeed)
//     {
//     case 2400:
//         cfsetispeed(&newtio, B2400);
//         cfsetospeed(&newtio, B2400);
//         break;
//     case 4800:
//         cfsetispeed(&newtio, B4800);
//         cfsetospeed(&newtio, B4800);
//         break;
//     case 9600:
//         cfsetispeed(&newtio, B9600);
//         cfsetospeed(&newtio, B9600);
//         break;
//     case 115200:
//         cfsetispeed(&newtio, B115200);
//         cfsetospeed(&newtio, B115200);
//         break;
//     case 460800:
//         cfsetispeed(&newtio, B460800);
//         cfsetospeed(&newtio, B460800);
//         break;
//     default:
//         cfsetispeed(&newtio, B9600);
//         cfsetospeed(&newtio, B9600);
//         break;
//     }
    
//     if (nStop == 1)
//         newtio.c_cflag &= ~CSTOPB;
//     else if (nStop == 2)
//         tcflush(fd, TCIFLUSH);

//     if ((tcsetattr(fd, TCSANOW, &newtio)) != 0)
//     {
//         perror("com set error");
//         return -1;
//     }
//     return 0;
// }

// // 向232的RX写入数据
// void write_to_rx(int fd, const char *message)
// {
//     write(fd, message, strlen(message));
//     printf("Write message to RX: %s\n", message);
// }
